#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>

int main()
{
    const char *str1 = "hello printf\n";
    const char *str2 = "hello fprintf\n";
    const char *str3 = "hello fputs\n";
    const char *str4 = "hello write\n";

    //c库函数
    printf(str1);
    fprintf(stdout,str2);
    fputs(str3,stdout);

    //系统接口
    write(1,str4,strlen(str4));

    //调用完上面，指执行fork
    fork(); 
    return 0;
}

//int main()
//{
//    // 是否带"\n"所出现的实验现象
//    
//    //printf没有立即刷新的原因，是因为有缓冲区的存在
//    printf(" hello printf"); // stdout -> 1, printf封装了write
//    fprintf(stdout," hello fprintf");
//    fputs(" hello fputs",stdout);
//
//
//    //write是立即刷新了的！
//    //那么这个缓冲区在哪里呢？（或者这个缓冲区一定不在哪里呢？）-> 一定不在write内部
//    //我们曾经说的缓冲区，不是内核级别的。因此缓冲区只能是C语言提供的，语言级别的缓冲区。
//    const char* msg = "hello write";
//    write(1,msg,strlen(msg));
//    
//    sleep(5);
//    return 0;
//}


//int main()
//{
//    //close(1);
//    umask(0);
//    // 根据fd的分配规则，新的fd值一定是1
//    int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//    if(fd < 0)
//    {
//        perror("open false");
//        return 1;
//    }
//
//    dup2(fd,1);
//
//    // printf->stdout->1->虽然不在指向对应的显示器了，但是已经指向了log.txt的底层struct file对象。
//    printf("fd : %d\n",fd);
//    // 为什么要使用fflush,这就和缓冲区有关了
//    fflush(stdout);
//
//    close(fd);
//    return 0;
//}


//int main()
//{
//    printf("stdin  : %d\n",stdin->_fileno);
//    printf("stdout : %d\n",stdout->_fileno);
//    printf("stderr : %d\n",stderr->_fileno);
//    return 0;
//}


//int main()
//{
//    int fd1 = open("log1.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//    int fd2 = open("log2.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//    int fd3 = open("log3.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//    int fd4 = open("log4.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//    int fd5 = open("log5.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
//
//    printf("fd1 : %d\n",fd1);
//    printf("fd2 : %d\n",fd2);
//    printf("fd3 : %d\n",fd3);
//    printf("fd4 : %d\n",fd4);
//    printf("fd5 : %d\n",fd5);
//
//    return 0;
//}
